﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using TireSizesCalculator.Model;
using System.Text.RegularExpressions;


namespace TireSizesCalculator.Controller
{
    public class TireSizeController
    {
        private string _sizesFile = System.Environment.CurrentDirectory + @"\sizes.txt";
        public string SizesFile
        {
            get
            {
                return _sizesFile;
            }
            set
            {
                _sizesFile = value;
                LoadSizes();
            }
        }
        private TireSizesList _sizes;


        /// <summary>
        /// Konstruktor
        /// </summary>
        public TireSizeController()
        {
            _sizes = new TireSizesList();
            LoadSizes();
        }


        /// <summary>
        /// Wyszukuje opony dopasowane do podanego rozmiaru
        /// </summary>
        /// <param name="size">Rozmiar w milimetrach, do którego dopasowane będą wyniki</param>
        /// <param name="errPercent">Maksymalny dopuszczalny błąd w procentach</param>
        /// <returns>Dopasowane opony</returns>
        public List<TireMatch> GetMatchingSizes(TireSize size, double errPercent)
        {
            return _sizes.GetSizesFor(size, errPercent);
        }

        public int[] GetWidths()
        {
            return _sizes.GetWidths().ToArray();
        }

        public int[] GetProfiles()
        {
            return _sizes.GetProfiles().ToArray();
        }

        public int[] GetRadiuses()
        {
            return _sizes.GetRadiuses().ToArray();
        }

        public List<TireSize> GetTireSizes()
        {
            return _sizes.GetList();
        }

        public double GetMinTireSize()
        {
            return _sizes.GetMinTireSize();
        }

        public double GetMaxTireSize()
        {
            return _sizes.GetMaxTireSize();
        }

        /// <summary>
        /// Sprawdza, czy rozmiar jest prawidłowy
        /// </summary>
        /// <returns>Flaga określająca poprawność danych</returns>
        public bool CheckSize(TireSize size)
        {
            return _sizes.CheckSize(size);
        }

        /// <summary>
        /// Sprawdza, czy rozmiar jest prawidłowy
        /// </summary>
        /// <returns>Flaga określająca poprawność danych</returns>
        public bool CheckSize(int width, int profile, int radius)
        {
            return _sizes.CheckSize(new TireSize(width, profile, radius));
        }


        /// <summary>
        /// Wczytuje z pliku dostępne wielkości opon
        /// </summary>
        private void LoadSizes()
        {
            if (_sizes.Count != 0)
            {
                _sizes = new TireSizesList();
            }

            String content = ReadFileContent(_sizesFile);
            MatchCollection matches = TireSize.SizeFormatRegex.Matches(content);
            
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    _sizes.AddSize(match.Groups[0].Value);
                }
            }
        }

        /// <summary>
        /// Wczytuje całą zawartość pliku tekstowego
        /// </summary>
        /// <param name="path">Ścieżka do pliku tekstowego</param>
        /// <returns>Zawartość pliku tekstowego</returns>
        private String ReadFileContent(String path)
        {
            StreamReader reader = null;
            String fileContent = String.Empty;

            try
            {
                reader = new StreamReader(path);
                fileContent = reader.ReadToEnd();
                reader.Close();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
            }

            return fileContent;
        }
    }
}
